﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;

/// <summary>
/// Descripción breve de TramiteCRN
/// </summary>
namespace Iudicium.Tramites.CRN
{
    public class TramiteCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");
        public TramiteCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertTramite(Tramite objTramite, ref string codigo, string involucrados)
        {
            if (objTramite == null)
            {
                throw new ArgumentException("el tramite no puede ser nulo.");
            }

            if (objTramite.TipoTramiteId <= 0)
            {
                throw new ArgumentException("el tipotramiteid no puede ser menor o igual a cero");
            }

            if (string.IsNullOrEmpty(involucrados))
            {
                throw new ArgumentException("El conjunto de involucrados no puede ser nulo o vacio.");
            }

            int? TramiteId = 0;

            TramiteDSTableAdapters.TramiteTableAdapter adapter =
                new TramiteDSTableAdapters.TramiteTableAdapter();

            adapter.Insert(ref TramiteId,
                ref codigo,
                objTramite.TipoTramiteId,
                objTramite.FechaInicio,
                objTramite.FechaFin,
                objTramite.FechaEntregaEstimada,
                objTramite.Observacion,
                involucrados);

            if (TramiteId == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return TramiteId.Value;
        }

        public static void UpdateTramite(Tramite objTramite, string involucradosEliminados, string involucradosInsertados)
        {
            
            TramiteDSTableAdapters.TramiteTableAdapter adpater =
                   new TramiteDSTableAdapters.TramiteTableAdapter();

            adpater.Update(objTramite.ServicioId, objTramite.FechaEntregaEstimada, objTramite.Observacion, objTramite.TipoTramiteId, involucradosInsertados,  involucradosEliminados );

        }

        public static void DeleteTramite(int TramiteId)
        {
            if (TramiteId <= 0)
            {
                throw new ArgumentException("tramiteId no puede ser menor o igual que cero.");
            }
            TramiteDSTableAdapters.TramiteTableAdapter adpater =
                  new TramiteDSTableAdapters.TramiteTableAdapter();

            adpater.Delete(TramiteId);

        }

        public static Tramite GetTramiteById(int TramiteId)
        {
            if (TramiteId <= 0)
            {
                throw new ArgumentException("tramiteId no puede ser menor o igual que cero.");
            }

            TramiteDSTableAdapters.TramiteTableAdapter adpater =
                new TramiteDSTableAdapters.TramiteTableAdapter();

            TramiteDS.TramiteDataTable tabla =
                adpater.GetTramiteById(TramiteId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener " + TramiteId + " de la base de datos");
            }
            return ConstruirTramite(tabla[0]);
        }

        public static List<Tramite> GetTramiteBySearch(string parametro, string estados, int usuarioId, bool tienePermiso)
        {
            if (usuarioId <= 0)
            {
                throw new Exception("UsuarioId  no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(estados))
            {
                throw new Exception("UsuarioId  no puede ser menor o igual que cero.");
            }
            List<Tramite> lista = new List<Tramite>();

            TramiteDSTableAdapters.TramiteTableAdapter adpater =
                  new TramiteDSTableAdapters.TramiteTableAdapter();

            TramiteDS.TramiteDataTable tabla =
                adpater.GetTramiteBySearch(parametro, estados, tienePermiso, usuarioId);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (TramiteDS.TramiteRow row in tabla)
            {
                Tramite obj = ConstruirTramite(row);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static Tramite ConstruirTramite(TramiteDS.TramiteRow row)
        {
            if (row == null)
                return null;
            Tramite objTramite = new Tramite(row.tramiteId,
                    row.codigoServicio,
                    row.fechaInicio,
                    row.IsfechaFinNull() ? DateTime.MinValue :  row.fechaFin,
                    row.fechaEntregaEstimada,
                    row.observacion,
                    row.estado,
                    row.tipoTramiteId,
                    row.involucrados,
                    row.responsables,
                    row.tipo,
                    row.categoria);
            if (!row.IsfechaEntregaNull())
                objTramite.FechaEntrega = row.fechaEntrega;
            objTramite.EntregadoA = row.IsentregadoANull() ? "" : row.entregadoA;
            objTramite.ObservacionEntrega = row.IsobservacionEntregaNull() ? "" : row.observacionEntrega;
            return objTramite;

        }
     
    }
}
